package com.laowu.netty.bean;

import com.laowu.netty.menum.MessageTypeEnum;

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

/**
 * @author laowu
 * @date 2020/11/26 17:11
 * @desc 定义消息实体
 */
public class Message {
    /**
     * 一个固定的数字，一般用于指定当前字节序列是当前类型的协议，
     * 比如java生成的class文件起始就是用0xCAFEBABE作为其标识符，
     * 对应本服务，这里将其定义为0x1314
     */
    private int magicNumber;
    /**
     * 当前服务器版本代码的主版本号
     */
    private byte mainVersion;
    /**
     * 当前服务器版本号的次版本号
     */
    private byte subVersion;
    /**
     * 当前服务版本的修订版本号
     */
    private byte modifyVersion;
    /**
     * 当前请求的会话id,用于将请求和响应串联到一起
     */
    private String sessionId;
    /**
     * 消息类型 长度 = 1b
     * 请求 1-表示当前是一个请求消息
     * 响应 2-表示当前是一个响应消息
     * ping 3-表示当前是一个ping消息
     * pong 4-表示当前是一个pong消息
     * Empty 5-表示当前是一个空消息，该消息不会被写入数据管道中
     */
    private MessageTypeEnum messageType;

    /**
     * 附加数据 长度不定
     * 附加消息是字符串键值对来表示的，这里首先使用两个字节记录键值对的个数，
     * 然后对每个键和值，都首先使用4个字节记录其长度，然后是具体的数据，其形式如：
     * 键值对个数+键长度+键数据+值长度+值数据
     */
    private Map<String, String> attachments = new HashMap<>();

    /**
     * 消息体 长度 = 4b
     * 记录消息体的长度
     */
    private int length;

    /**
     * 消息体
     * 服务之间交互所发送的或接受的数据，其长度有前面的length指定
     */
    private String body;

    public Map<String, String> getAttachments() {
        return Collections.unmodifiableMap(attachments);
    }

    public void setAttachments(Map<String, String> attachments) {
        this.attachments.clear();
        if (null != attachments) {
            this.attachments.putAll(attachments);
        }
    }

    public void addAttachment(String key, String value) {
        attachments.put(key, value);
    }


    public int getMagicNumber() {
        return magicNumber;
    }

    public void setMagicNumber(int magicNumber) {
        this.magicNumber = magicNumber;
    }

    public byte getMainVersion() {
        return mainVersion;
    }

    public void setMainVersion(byte mainVersion) {
        this.mainVersion = mainVersion;
    }

    public byte getSubVersion() {
        return subVersion;
    }

    public void setSubVersion(byte subVersion) {
        this.subVersion = subVersion;
    }

    public byte getModifyVersion() {
        return modifyVersion;
    }

    public void setModifyVersion(byte modifyVersion) {
        this.modifyVersion = modifyVersion;
    }

    public String getSessionId() {
        return sessionId;
    }

    public void setSessionId(String sessionId) {
        this.sessionId = sessionId;
    }

    public MessageTypeEnum getMessageType() {
        return messageType;
    }

    public void setMessageType(MessageTypeEnum messageType) {
        this.messageType = messageType;
    }

    public int getLength() {
        return length;
    }

    public void setLength(int length) {
        this.length = length;
    }

    public String getBody() {
        return body;
    }

    public void setBody(String body) {
        this.body = body;
    }
}
